/*
  异步操作
  FutureBuilder：处理单个异步操作
  StreamBuilder：处理多个异步操作, 在执行异步任务时，可以通过多次触发成功或失败事件来传递结果数据或错误异常
  甚至可以作为事件总线模型
 */

import 'package:flutter/material.dart';

void main(){
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(title: Text('异步操作'),),
      body: HomePage(),
    ),
  ));
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: FutureBuilder<String>(
          // 执行异步操作
          future: mockNetworkData(),
          builder: (BuildContext context, AsyncSnapshot snapshot){
            // 请求已结束
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                // 请求失败，显示错误
                return Text("Error: ${snapshot.error}");
              } else {
                // 请求成功，显示数据
                return Text("Contents: ${snapshot.data}");
              }
            } else {
              // 请求未结束，显示loading
              return CircularProgressIndicator();
            }
          }),
    );
  }
}

Future<String> mockNetworkData() async {
  return Future.delayed(Duration(seconds: 3), () => "我是从互联网上获取的数据");
}